<?php

declare(strict_types=1);

namespace Zms\Validate\Rule;

use Zms\Unit\Is;

/**
 * JSON 数据验证器
 *
 * 该类用于检查给定值是否为有效的 JSON 格式。它继承自 RuleAbstract，并提供了设置默认错误消息以及执行具体验证逻辑的方法。
 * 如果输入值是一个有效的 JSON 字符串，则认为验证通过；否则，添加错误信息并返回 false。
 */
class JsonValidate extends RuleAbstract
{
    /**
     * 默认错误消息
     *
     * 当验证失败时显示的默认错误消息。可以包含占位符 `{label}`，将在实际使用时替换为字段标签。
     *
     * @var string
     */
    protected $_error = '{label}不是有效的数据格式';

    /**
     * 验证输入值是否为有效的 JSON 格式
     *
     * 如果输入值是一个非空字符串：
     * - 如果允许跳过空值并且值为空，则直接通过验证。
     * - 使用 Is::json 方法检查字符串是否为有效的 JSON 格式。如果有效，则记录该值并返回 true 表示验证通过。
     * 如果输入值不是有效的 JSON 字符串，则添加错误信息并返回 false。
     *
     * @param mixed $value 待验证的值
     * @param string $label 字段标签，用于错误提示信息中
     * @return bool 验证结果：成功为 true，失败为 false
     */
    public function validate($value, string $label = ''): bool
    {
        // 检查值是否为非空字符串
        if ($value && is_string($value)) {
            // 如果允许跳过空值并且值为空，则直接通过验证
            if (Is::empty($value) && $this->_noSkipping === true) {
                $this->_value = $value;
                return true;
            }
            // 检查字符串是否为有效的 JSON 格式
            if (Is::json($value)) {
                $this->_value = $value;
                return true;
            }
        }
        // 如果值不是有效的 JSON 字符串，添加错误信息并返回 false
        $this->addError($this->_error, $label);
        return false;
    }
}